package com.example.rabbitmq.controller;

import com.example.rabbitmq.domain.User;
import com.example.rabbitmq.service.MessageProducerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户相关控制器
 * 提供HTTP接口用于触发消息发布，演示基于RabbitMQ的发布/订阅模式
 */
@RestController // 标识为REST风格控制器，方法返回值直接作为HTTP响应体
public class UserController {

    /**
     * 注入消息生产者服务
     * 用于调用消息发送方法，将用户信息发送到RabbitMQ交换机
     */
    @Autowired
    private MessageProducerService messageProducerService;

    /**
     * 发布用户信息到RabbitMQ（发布/订阅模式）
     * 通过URL路径参数接收用户ID和用户名，创建User对象并发送到消息队列
     * @param id 用户ID（从URL路径中获取）
     * @param username 用户名（从URL路径中获取）
     */
    @RequestMapping("/user/{id}/{username}") // 映射HTTP请求路径，支持GET/POST等方法
    // @PathVariable注解用于获取URL路径中的参数值
    public void psubPublisher(@PathVariable Integer id, @PathVariable String username) {
        // 创建User对象，封装用户信息
        User user = new User(id, username);
        // 调用消息生产者服务的方法，将用户对象发送到RabbitMQ
        messageProducerService.psubPublisher(user);
    }

    /**
     * 处理路由模式消息发布的HTTP接口
     * 接收前端传递的消息参数，解析后调用消息生产者服务发送路由模式消息
     *
     * @param message 路径参数，格式为"级别&内容"（如"error&系统异常"）
     *                其中第一个部分为消息级别（用于路由），第二个部分为实际消息内容
     */
    @RequestMapping("/user/{message}") // 映射HTTP请求路径，支持GET/POST等方式访问
    public void routingPublisher(@PathVariable String message) {
        // 将路径参数按"&"符号分割为数组
        // 数组第一个元素为消息级别（如"info"、"error"），第二个元素为消息内容
        String[] strings = message.split("&");

        // 调用消息生产者服务的路由模式发送方法
        // 第一个参数：消息级别（用于生成路由键）
        // 第二个参数：实际要发送的消息内容
        messageProducerService.routingPublisher(strings[0], strings[1]);
    }

    /**
     * 处理主题模式（Topic）消息发布的HTTP接口
     * 接收前端传递的消息参数，解析后调用消息生产者服务发送主题模式消息
     * 主题模式支持通过通配符匹配路由键，实现更灵活的消息分类与路由
     *
     * @param message 路径参数，格式为"路由键&消息内容"（如"log.error&系统异常"）
     *                其中第一个部分为主题模式的路由键（可包含通配符相关的点号分隔符），
     *                第二个部分为实际要发送的消息内容
     */
    @RequestMapping("/user/topic/{message}") // 映射HTTP请求路径，支持通过该路径触发主题模式消息发布
    public void topicPublisher(@PathVariable String message) {
        // 将路径参数按"&"符号分割为数组
        // 数组第一个元素为主题模式的路由键（如"user.login"、"order.pay.success"）
        // 数组第二个元素为要发送的实际消息内容
        String[] strings = message.split("&");

        // 调用消息生产者服务的主题模式发送方法
        // 第一个参数：主题模式的路由键（用于与队列的绑定键进行通配符匹配）
        // 第二个参数：实际要发送的消息内容
        messageProducerService.topicPublisher(strings[0], strings[1]);
    }

}